package controladores;

import ejb.negocio.GestorUsuariosServiceLocal;
import entidades.Cliente;
import entidades.Usuario;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

/**
 *
 * @author ribadas
 */
@ManagedBean(name = "usuarioController")
@SessionScoped
public class UsuarioController extends BaseController {
    // Atributos

    private Usuario usuarioActual = null;
    private Cliente clienteActual = null;
    private String login = "";
    private String password = "";
    private String password2 = "";
    private boolean nuevoUsuario = true;
    // EJBs
    @EJB
    private GestorUsuariosServiceLocal gestorUsuariosService;

    /** Creates a new instance of UsuarioController */
    public UsuarioController() {
    }

    // Acciones para paginas JSF
    public String doLogin() {
        String destino = null;

        if (gestorUsuariosService.autenticarUsuario(login, password)) {
            clienteActual = gestorUsuariosService.recuperarDatosCliente(login);
            usuarioActual = clienteActual.getUsuario();
            password2 = password;
            nuevoUsuario = false;
            destino = "exito.login";
        } else {
            destino = "fallo.login";
        }

        return destino;
    }

    public String doLogout() {
        String destino = null;
        if (usuarioActual != null) {
            gestorUsuariosService.actualizarUltimoAcceso(usuarioActual.getId());
            // carroCompraController.vaciarCarro();
        }
        usuarioActual = null;
        clienteActual = null;
        login = "";
        password = "";
        password2 = "";

        nuevoUsuario = true;

        // Limpiar los objetos de sesión (vaciar la sesión)
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();        
        
        destino = "exito.logout";
        
        return destino;
    }

    public String doNuevoUsuario() {
        nuevoUsuario = true;
        usuarioActual = new Usuario();
        clienteActual = new Cliente();
        login = "";
        password = "";
        password2 = "";

        return "usuario.nuevo";
    }

    public String doCrearUsuario() {
        String destino = null;

        if (login.equals("")) {
            anadirMensajeError("No se ha indicado un nombre de usuario");
        } else if (password.equals("")) {
            anadirMensajeError("No se ha indicado una contraseña");
        } else if (password2.equals("")) {
            anadirMensajeError("No se ha repetido la contraseña");
        } else if (!password.equals(password2)) {
            anadirMensajeError("Las contraseñas introducidas no coinciden");
        } else if (gestorUsuariosService.existeUsuario(login)) {
            anadirMensajeError("El nombre de usuario " + login + " ya existe");
        } else {
            clienteActual = gestorUsuariosService.crearNuevoCliente(login, password, clienteActual);
            usuarioActual = clienteActual.getUsuario();
            nuevoUsuario = false;
            destino = "usuario.creado";
        }

        return destino;
    }

    public String doActualizarUsuario() {
        String destino = null;

        if (password.equals("")) {
            anadirMensajeError("No se ha indicado una contraseña");
        } else if (password2.equals("")) {
            anadirMensajeError("No se ha repetido la contraseña");
        } else if (!password.equals(password2)) {
            anadirMensajeError("Las contraseñas introducidas no coinciden");
        } else {
            gestorUsuariosService.actualizarPassword(usuarioActual.getId(), password);
            gestorUsuariosService.actualizarDatosCliente(clienteActual);
            destino = "usuario.actualizado";
        }
        return destino;
    }

    public String doCancelarModificacionUsuario() {
        String destino = null;
        if (nuevoUsuario) {
            // Anular los datos del nuevo cliente no guardado
            usuarioActual = null;
            clienteActual = null;
        } else {
            // Recuperar los datos originales del cliente
            clienteActual = gestorUsuariosService.recuperarDatosCliente(usuarioActual.getLogin()); // El login nunca se edita
            usuarioActual = clienteActual.getUsuario();
        }
        destino = "usuario.cancelado";
        return destino;
    }

    public String doVerPerfil() {
        login = usuarioActual.getLogin();
        password = usuarioActual.getPassword();
        password2 = password;
        return "usuario.perfil";
    }

    // Metodos get y set
    public Cliente getClienteActual() {
        return clienteActual;
    }

    public void setClienteActual(Cliente cliente) {
        this.clienteActual = cliente;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword2() {
        return password2;
    }

    public void setPassword2(String password2) {
        this.password2 = password2;
    }

    public Usuario getUsuarioActual() {
        return usuarioActual;
    }

    public void setUsuarioActual(Usuario usuario) {
        this.usuarioActual = usuario;
    }

    public boolean isNuevoUsuario() {
        return nuevoUsuario;
    }

    public void setNuevoUsuario(boolean nuevoUsuario) {
        this.nuevoUsuario = nuevoUsuario;
    }
    // Metodos privados
}
